﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Bomberman
{
	[Serializable]
	public class Proyectil : Posicionable, Representable, DependienteDelTiempo
	{
		string direccionMovimiento = null;
		public const int Velocidad = 10;
		private int contadorVelocidad = Velocidad;
		int retardoExplosion = 5;
		private String nombre = "Proyectil";
		Bomba bomba;	// Para hacer la explosion del proyectil usamos lo implementado en bomba
		private Casillero casilleroActual;

		public Proyectil()
		{
			bomba = new Bomba("Proyectil", 5, 1, 0);
		}

		public void Update()
		{
			contadorVelocidad--;
			if (PuedeAvanzar() == false) return;

			retardoExplosion--;

			if (retardoExplosion <= 0) 
			{
				Explotar(); return;
			}

			if (casilleroActual.Adyacentes[direccionMovimiento] == null) 
			{
				Explotar(); // Llego al extremo del mapa, entonces explota
				return;
			}

			casilleroActual.QuitarContenido(this); // Avanza, lo saco de su casillero actual
			casilleroActual.QuitarDependienteDelTiempo(this);

			this.Posicionar(casilleroActual.Adyacentes[direccionMovimiento]); // Actualizo el casillero

			if (casilleroActual.EsTransitable() == false) Explotar();

		}

		private bool PuedeAvanzar()
		{
			if (contadorVelocidad < 0)
			{
				contadorVelocidad = Velocidad;
				return true;
			}
			return false;
		}

		public bool ObstruyeCamino()
		{
			return false;
		}

		public void RecibirAtaque(int danio)
		{
			Explotar();
		}

		public void Disparar(string direccion)
		{
			direccionMovimiento = direccion;
		}

		public void Posicionar(Casillero unCasillero)
		{
			casilleroActual = unCasillero;
			casilleroActual.AgregarContenido(this);
			casilleroActual.AgregarDependienteDelTiempo(this);
		}

		public void Explotar()
		{
			casilleroActual.QuitarDependienteDelTiempo(this);
			casilleroActual.QuitarContenido(this);
			bomba.Posicionar(casilleroActual);
			bomba.Explotar();
		}

		// Implementacion de la interfaz Representable
		public String ObtenerNombre()
		{
			return nombre;
		}
	
	}
}
